home *** CD-ROM | disk | FTP | other *** search
/ Champak 141 / (Vol 141) Oct 17 2011.iso / Games / Clueless.swf / scripts / fl / video / NCManager.as < prev    next >
Encoding:
Text File  |  2011-10-17  |  38.5 KB  |  995 lines

  1. package fl.video
  2. {
  3.    import flash.events.NetStatusEvent;
  4.    import flash.events.TimerEvent;
  5.    import flash.net.*;
  6.    import flash.utils.Timer;
  7.    
  8.    use namespace flvplayback_internal;
  9.    
  10.    public class NCManager implements INCManager
  11.    {
  12.       
  13.       public static const VERSION:String = "2.1.0.14";
  14.       
  15.       public static const SHORT_VERSION:String = "2.1";
  16.        
  17.       
  18.       flvplayback_internal var _serverName:String;
  19.       
  20.       flvplayback_internal var _tryNCTimer:Timer;
  21.       
  22.       flvplayback_internal var _autoSenseBW:Boolean;
  23.       
  24.       flvplayback_internal var _fpadZone:Number;
  25.       
  26.       flvplayback_internal var _appName:String;
  27.       
  28.       public const DEFAULT_TIMEOUT:uint = 60000;
  29.       
  30.       flvplayback_internal var _ncConnected:Boolean;
  31.       
  32.       flvplayback_internal var _fpadMgr:FPADManager;
  33.       
  34.       flvplayback_internal var _bitrate:Number;
  35.       
  36.       flvplayback_internal var _timeoutTimer:Timer;
  37.       
  38.       flvplayback_internal var _wrappedURL:String;
  39.       
  40.       flvplayback_internal var _payload:Number;
  41.       
  42.       flvplayback_internal var _proxyType:String;
  43.       
  44.       flvplayback_internal var _nc:NetConnection;
  45.       
  46.       flvplayback_internal var _streamLength:Number;
  47.       
  48.       flvplayback_internal var _connTypeCounter:uint;
  49.       
  50.       flvplayback_internal var _streamWidth:int;
  51.       
  52.       flvplayback_internal var _ncUri:String;
  53.       
  54.       flvplayback_internal var _contentPath:String;
  55.       
  56.       flvplayback_internal var _smilMgr:SMILManager;
  57.       
  58.       flvplayback_internal var _streamHeight:int;
  59.       
  60.       flvplayback_internal var _isRTMP:Boolean;
  61.       
  62.       flvplayback_internal var _tryNC:Array;
  63.       
  64.       flvplayback_internal var _owner:VideoPlayer;
  65.       
  66.       flvplayback_internal var _streams:Array;
  67.       
  68.       flvplayback_internal var _portNumber:String;
  69.       
  70.       flvplayback_internal var _streamName:String;
  71.       
  72.       flvplayback_internal var _objectEncoding:uint;
  73.       
  74.       public var fallbackServerName:String;
  75.       
  76.       flvplayback_internal var _protocol:String;
  77.       
  78.       public function NCManager()
  79.       {
  80.          super();
  81.          flvplayback_internal::_fpadZone = NaN;
  82.          flvplayback_internal::_objectEncoding = ObjectEncoding.AMF0;
  83.          flvplayback_internal::_proxyType = "best";
  84.          flvplayback_internal::_timeoutTimer = new Timer(DEFAULT_TIMEOUT);
  85.          flvplayback_internal::_timeoutTimer.addEventListener(TimerEvent.TIMER,this.flvplayback_internal::_onFMSConnectTimeOut);
  86.          flvplayback_internal::_tryNCTimer = new Timer(1500,1);
  87.          flvplayback_internal::_tryNCTimer.addEventListener(TimerEvent.TIMER,this.flvplayback_internal::nextConnect);
  88.          flvplayback_internal::initNCInfo();
  89.          flvplayback_internal::initOtherInfo();
  90.          flvplayback_internal::_nc = null;
  91.          flvplayback_internal::_ncConnected = false;
  92.       }
  93.       
  94.       flvplayback_internal static function stripFrontAndBackWhiteSpace(param1:String) : String
  95.       {
  96.          var _loc2_:uint = 0;
  97.          var _loc3_:uint = 0;
  98.          var _loc4_:int = 0;
  99.          var _loc5_:int = 0;
  100.          _loc3_ = uint(param1.length);
  101.          _loc4_ = 0;
  102.          _loc5_ = int(_loc3_);
  103.          _loc2_ = 0;
  104.          while(true)
  105.          {
  106.             if(_loc2_ < _loc3_)
  107.             {
  108.                switch(param1.charCodeAt(_loc2_))
  109.                {
  110.                   case 9:
  111.                   case 10:
  112.                   case 13:
  113.                   case 32:
  114.                      break;
  115.                   default:
  116.                      _loc4_ = int(_loc2_);
  117.                }
  118.             }
  119.             break;
  120.             _loc2_++;
  121.          }
  122.          _loc2_ = _loc3_;
  123.          while(true)
  124.          {
  125.             if(_loc2_ >= 0)
  126.             {
  127.                switch(param1.charCodeAt(_loc2_))
  128.                {
  129.                   case 9:
  130.                   case 10:
  131.                   case 13:
  132.                   case 32:
  133.                      break;
  134.                   default:
  135.                      _loc5_ = _loc2_ + 1;
  136.                }
  137.             }
  138.             break;
  139.             _loc2_--;
  140.          }
  141.          if(_loc5_ <= _loc4_)
  142.          {
  143.             return "";
  144.          }
  145.          return param1.slice(_loc4_,_loc5_);
  146.       }
  147.       
  148.       flvplayback_internal function initNCInfo() : void
  149.       {
  150.          flvplayback_internal::_isRTMP = false;
  151.          flvplayback_internal::_serverName = null;
  152.          flvplayback_internal::_wrappedURL = null;
  153.          flvplayback_internal::_portNumber = null;
  154.          flvplayback_internal::_appName = null;
  155.       }
  156.       
  157.       flvplayback_internal function cleanConns() : void
  158.       {
  159.          var _loc1_:uint = 0;
  160.          flvplayback_internal::_tryNCTimer.reset();
  161.          if(flvplayback_internal::_tryNC != null)
  162.          {
  163.             _loc1_ = 0;
  164.             while(_loc1_ < flvplayback_internal::_tryNC.length)
  165.             {
  166.                if(flvplayback_internal::_tryNC[_loc1_] != null)
  167.                {
  168.                   flvplayback_internal::_tryNC[_loc1_].removeEventListener(NetStatusEvent.NET_STATUS,flvplayback_internal::connectOnStatus);
  169.                   if(flvplayback_internal::_tryNC[_loc1_].client.pending)
  170.                   {
  171.                      flvplayback_internal::_tryNC[_loc1_].addEventListener(NetStatusEvent.NET_STATUS,flvplayback_internal::disconnectOnStatus);
  172.                   }
  173.                   else
  174.                   {
  175.                      flvplayback_internal::_tryNC[_loc1_].close();
  176.                   }
  177.                }
  178.                flvplayback_internal::_tryNC[_loc1_] = null;
  179.                _loc1_++;
  180.             }
  181.             flvplayback_internal::_tryNC = null;
  182.          }
  183.       }
  184.       
  185.       public function get streamWidth() : int
  186.       {
  187.          return flvplayback_internal::_streamWidth;
  188.       }
  189.       
  190.       public function connectToURL(param1:String) : Boolean
  191.       {
  192.          var parseResults:ParseResults = null;
  193.          var canReuse:Boolean = false;
  194.          var name:String = null;
  195.          var url:String = param1;
  196.          flvplayback_internal::initOtherInfo();
  197.          flvplayback_internal::_contentPath = url;
  198.          if(flvplayback_internal::_contentPath == null || flvplayback_internal::_contentPath == "")
  199.          {
  200.             throw new VideoError(VideoError.INVALID_SOURCE);
  201.          }
  202.          parseResults = flvplayback_internal::parseURL(flvplayback_internal::_contentPath);
  203.          if(parseResults.streamName == null || parseResults.streamName == "")
  204.          {
  205.             throw new VideoError(VideoError.INVALID_SOURCE,url);
  206.          }
  207.          if(parseResults.isRTMP)
  208.          {
  209.             canReuse = flvplayback_internal::canReuseOldConnection(parseResults);
  210.             flvplayback_internal::_isRTMP = true;
  211.             flvplayback_internal::_protocol = parseResults.protocol;
  212.             flvplayback_internal::_streamName = parseResults.streamName;
  213.             flvplayback_internal::_serverName = parseResults.serverName;
  214.             flvplayback_internal::_wrappedURL = parseResults.wrappedURL;
  215.             flvplayback_internal::_portNumber = parseResults.portNumber;
  216.             flvplayback_internal::_appName = parseResults.appName;
  217.             if(flvplayback_internal::_appName == null || flvplayback_internal::_appName == "" || flvplayback_internal::_streamName == null || flvplayback_internal::_streamName == "")
  218.             {
  219.                throw new VideoError(VideoError.INVALID_SOURCE,url);
  220.             }
  221.             flvplayback_internal::_autoSenseBW = flvplayback_internal::_streamName.indexOf(",") >= 0;
  222.             return canReuse || flvplayback_internal::connectRTMP();
  223.          }
  224.          name = parseResults.streamName;
  225.          if(name.indexOf("?") < 0 && (name.length < 4 || name.slice(-4).toLowerCase() != ".txt") && (name.length < 4 || name.slice(-4).toLowerCase() != ".xml") && (name.length < 5 || name.slice(-5).toLowerCase() != ".smil"))
  226.          {
  227.             canReuse = flvplayback_internal::canReuseOldConnection(parseResults);
  228.             flvplayback_internal::_isRTMP = false;
  229.             flvplayback_internal::_streamName = name;
  230.             return canReuse || flvplayback_internal::connectHTTP();
  231.          }
  232.          if(name.indexOf("/fms/fpad") >= 0)
  233.          {
  234.             try
  235.             {
  236.                return flvplayback_internal::connectFPAD(name);
  237.             }
  238.             catch(err:Error)
  239.             {
  240.             }
  241.          }
  242.          flvplayback_internal::_smilMgr = new SMILManager(this);
  243.          return flvplayback_internal::_smilMgr.flvplayback_internal::connectXML(name);
  244.       }
  245.       
  246.       public function get streamName() : String
  247.       {
  248.          return flvplayback_internal::_streamName;
  249.       }
  250.       
  251.       flvplayback_internal function reconnectOnStatus(param1:NetStatusEvent) : void
  252.       {
  253.          if(param1.info.code == "NetConnection.Connect.Failed" || param1.info.code == "NetConnection.Connect.Rejected")
  254.          {
  255.             flvplayback_internal::_nc = null;
  256.             flvplayback_internal::_ncConnected = false;
  257.             flvplayback_internal::_owner.ncReconnected();
  258.          }
  259.       }
  260.       
  261.       public function get videoPlayer() : VideoPlayer
  262.       {
  263.          return flvplayback_internal::_owner;
  264.       }
  265.       
  266.       flvplayback_internal function getStreamLengthResult(param1:Number) : void
  267.       {
  268.          if(param1 > 0)
  269.          {
  270.             flvplayback_internal::_streamLength = param1;
  271.          }
  272.          flvplayback_internal::_owner.ncConnected();
  273.       }
  274.       
  275.       flvplayback_internal function canReuseOldConnection(param1:ParseResults) : Boolean
  276.       {
  277.          if(flvplayback_internal::_nc == null || !flvplayback_internal::_ncConnected)
  278.          {
  279.             return false;
  280.          }
  281.          if(!param1.isRTMP)
  282.          {
  283.             if(!flvplayback_internal::_isRTMP)
  284.             {
  285.                return true;
  286.             }
  287.             flvplayback_internal::_owner.close();
  288.             flvplayback_internal::_nc = null;
  289.             flvplayback_internal::_ncConnected = false;
  290.             flvplayback_internal::initNCInfo();
  291.             return false;
  292.          }
  293.          if(flvplayback_internal::_isRTMP)
  294.          {
  295.             if(param1.serverName == flvplayback_internal::_serverName && param1.appName == flvplayback_internal::_appName && param1.protocol == flvplayback_internal::_protocol && param1.portNumber == flvplayback_internal::_portNumber && param1.wrappedURL == flvplayback_internal::_wrappedURL)
  296.             {
  297.                return true;
  298.             }
  299.             flvplayback_internal::_owner.close();
  300.             flvplayback_internal::_nc = null;
  301.             flvplayback_internal::_ncConnected = false;
  302.          }
  303.          flvplayback_internal::initNCInfo();
  304.          return false;
  305.       }
  306.       
  307.       public function getProperty(param1:String) : *
  308.       {
  309.          switch(param1)
  310.          {
  311.             case "fallbackServerName":
  312.                return fallbackServerName;
  313.             case "fpadZone":
  314.                return flvplayback_internal::_fpadZone;
  315.             case "objectEncoding":
  316.                return flvplayback_internal::_objectEncoding;
  317.             case "proxyType":
  318.                return flvplayback_internal::_proxyType;
  319.             default:
  320.                throw new VideoError(VideoError.UNSUPPORTED_PROPERTY,param1);
  321.          }
  322.       }
  323.       
  324.       flvplayback_internal function connectRTMP() : Boolean
  325.       {
  326.          var _loc1_:int = 0;
  327.          var _loc2_:uint = 0;
  328.          flvplayback_internal::_timeoutTimer.stop();
  329.          flvplayback_internal::_timeoutTimer.start();
  330.          flvplayback_internal::_tryNC = new Array();
  331.          _loc1_ = flvplayback_internal::_protocol == "rtmp:/" || flvplayback_internal::_protocol == "rtmpe:/" ? 2 : 1;
  332.          _loc2_ = 0;
  333.          while(_loc2_ < _loc1_)
  334.          {
  335.             flvplayback_internal::_tryNC[_loc2_] = new NetConnection();
  336.             flvplayback_internal::_tryNC[_loc2_].objectEncoding = flvplayback_internal::_objectEncoding;
  337.             flvplayback_internal::_tryNC[_loc2_].proxyType = flvplayback_internal::_proxyType;
  338.             if(!isNaN(flvplayback_internal::_fpadZone))
  339.             {
  340.                flvplayback_internal::_tryNC[_loc2_].fpadZone = flvplayback_internal::_fpadZone;
  341.             }
  342.             flvplayback_internal::_tryNC[_loc2_].client = new ConnectClient(this,flvplayback_internal::_tryNC[_loc2_],_loc2_);
  343.             flvplayback_internal::_tryNC[_loc2_].addEventListener(NetStatusEvent.NET_STATUS,flvplayback_internal::connectOnStatus);
  344.             _loc2_++;
  345.          }
  346.          flvplayback_internal::nextConnect();
  347.          return false;
  348.       }
  349.       
  350.       public function reconnect() : void
  351.       {
  352.          if(!flvplayback_internal::_isRTMP)
  353.          {
  354.             throw new Error("Cannot call reconnect on an http connection");
  355.          }
  356.          flvplayback_internal::_nc.client = new ReconnectClient(this);
  357.          flvplayback_internal::_nc.addEventListener(NetStatusEvent.NET_STATUS,flvplayback_internal::reconnectOnStatus);
  358.          flvplayback_internal::_nc.connect(flvplayback_internal::_ncUri,false);
  359.       }
  360.       
  361.       public function helperDone(param1:Object, param2:Boolean) : void
  362.       {
  363.          var _loc3_:ParseResults = null;
  364.          var _loc4_:* = null;
  365.          var _loc5_:Boolean = false;
  366.          var _loc6_:uint = 0;
  367.          var _loc7_:Number = NaN;
  368.          if(!param2)
  369.          {
  370.             flvplayback_internal::_nc = null;
  371.             flvplayback_internal::_ncConnected = false;
  372.             flvplayback_internal::_owner.ncConnected();
  373.             flvplayback_internal::_smilMgr = null;
  374.             flvplayback_internal::_fpadMgr = null;
  375.             return;
  376.          }
  377.          _loc5_ = false;
  378.          if(param1 == flvplayback_internal::_fpadMgr)
  379.          {
  380.             _loc4_ = flvplayback_internal::_fpadMgr.flvplayback_internal::rtmpURL;
  381.             flvplayback_internal::_fpadMgr = null;
  382.             _loc3_ = flvplayback_internal::parseURL(_loc4_);
  383.             flvplayback_internal::_isRTMP = _loc3_.isRTMP;
  384.             flvplayback_internal::_protocol = _loc3_.protocol;
  385.             flvplayback_internal::_serverName = _loc3_.serverName;
  386.             flvplayback_internal::_portNumber = _loc3_.portNumber;
  387.             flvplayback_internal::_wrappedURL = _loc3_.wrappedURL;
  388.             flvplayback_internal::_appName = _loc3_.appName;
  389.             flvplayback_internal::_streamName = _loc3_.streamName;
  390.             _loc7_ = flvplayback_internal::_fpadZone;
  391.             flvplayback_internal::_fpadZone = NaN;
  392.             flvplayback_internal::connectRTMP();
  393.             flvplayback_internal::_fpadZone = _loc7_;
  394.             return;
  395.          }
  396.          if(param1 != flvplayback_internal::_smilMgr)
  397.          {
  398.             return;
  399.          }
  400.          flvplayback_internal::_streamWidth = flvplayback_internal::_smilMgr.flvplayback_internal::width;
  401.          flvplayback_internal::_streamHeight = flvplayback_internal::_smilMgr.flvplayback_internal::height;
  402.          if((_loc4_ = String(flvplayback_internal::_smilMgr.flvplayback_internal::baseURLAttr[0])) != null && _loc4_ != "")
  403.          {
  404.             if(_loc4_.charAt(_loc4_.length - 1) != "/")
  405.             {
  406.                _loc4_ += "/";
  407.             }
  408.             _loc3_ = flvplayback_internal::parseURL(_loc4_);
  409.             flvplayback_internal::_isRTMP = _loc3_.isRTMP;
  410.             _loc5_ = true;
  411.             flvplayback_internal::_streamName = _loc3_.streamName;
  412.             if(flvplayback_internal::_isRTMP)
  413.             {
  414.                flvplayback_internal::_protocol = _loc3_.protocol;
  415.                flvplayback_internal::_serverName = _loc3_.serverName;
  416.                flvplayback_internal::_portNumber = _loc3_.portNumber;
  417.                flvplayback_internal::_wrappedURL = _loc3_.wrappedURL;
  418.                flvplayback_internal::_appName = _loc3_.appName;
  419.                if(flvplayback_internal::_appName == null || flvplayback_internal::_appName == "")
  420.                {
  421.                   flvplayback_internal::_smilMgr = null;
  422.                   throw new VideoError(VideoError.INVALID_XML,"Base RTMP URL must include application name: " + _loc4_);
  423.                }
  424.                if(flvplayback_internal::_smilMgr.flvplayback_internal::baseURLAttr.length > 1)
  425.                {
  426.                   _loc3_ = flvplayback_internal::parseURL(flvplayback_internal::_smilMgr.flvplayback_internal::baseURLAttr[1]);
  427.                   if(_loc3_.serverName != null)
  428.                   {
  429.                      fallbackServerName = _loc3_.serverName;
  430.                   }
  431.                }
  432.             }
  433.          }
  434.          flvplayback_internal::_streams = flvplayback_internal::_smilMgr.flvplayback_internal::videoTags;
  435.          flvplayback_internal::_smilMgr = null;
  436.          _loc6_ = 0;
  437.          while(_loc6_ < flvplayback_internal::_streams.length)
  438.          {
  439.             _loc4_ = String(flvplayback_internal::_streams[_loc6_].src);
  440.             _loc3_ = flvplayback_internal::parseURL(_loc4_);
  441.             if(!_loc5_)
  442.             {
  443.                flvplayback_internal::_isRTMP = _loc3_.isRTMP;
  444.                _loc5_ = true;
  445.                if(flvplayback_internal::_isRTMP)
  446.                {
  447.                   flvplayback_internal::_protocol = _loc3_.protocol;
  448.                   if(flvplayback_internal::_streams.length > 1)
  449.                   {
  450.                      throw new VideoError(VideoError.INVALID_XML,"Cannot switch between multiple absolute RTMP URLs, must use meta tag base attribute.");
  451.                   }
  452.                   flvplayback_internal::_serverName = _loc3_.serverName;
  453.                   flvplayback_internal::_portNumber = _loc3_.portNumber;
  454.                   flvplayback_internal::_wrappedURL = _loc3_.wrappedURL;
  455.                   flvplayback_internal::_appName = _loc3_.appName;
  456.                   if(flvplayback_internal::_appName == null || flvplayback_internal::_appName == "")
  457.                   {
  458.                      throw new VideoError(VideoError.INVALID_XML,"Base RTMP URL must include application name: " + _loc4_);
  459.                   }
  460.                }
  461.                else if(_loc3_.streamName.indexOf("/fms/fpad") >= 0 && flvplayback_internal::_streams.length > 1)
  462.                {
  463.                   throw new VideoError(VideoError.INVALID_XML,"Cannot switch between multiple absolute fpad URLs, must use meta tag base attribute.");
  464.                }
  465.             }
  466.             else if(flvplayback_internal::_streamName != null && flvplayback_internal::_streamName != "" && !_loc3_.isRelative && flvplayback_internal::_streams.length > 1)
  467.             {
  468.                throw new VideoError(VideoError.INVALID_XML,"When using meta tag base attribute, cannot use absolute URLs for video or ref tag src attributes.");
  469.             }
  470.             flvplayback_internal::_streams[_loc6_].parseResults = _loc3_;
  471.             _loc6_++;
  472.          }
  473.          flvplayback_internal::_autoSenseBW = flvplayback_internal::_streams.length > 1;
  474.          if(!flvplayback_internal::_autoSenseBW)
  475.          {
  476.             if(flvplayback_internal::_streamName != null)
  477.             {
  478.                flvplayback_internal::_streamName += flvplayback_internal::_streams[0].parseResults.streamName;
  479.             }
  480.             else
  481.             {
  482.                flvplayback_internal::_streamName = flvplayback_internal::_streams[0].parseResults.streamName;
  483.             }
  484.             if(flvplayback_internal::_isRTMP && flvplayback_internal::_streamName.substr(-4).toLowerCase() == ".flv")
  485.             {
  486.                flvplayback_internal::_streamName = flvplayback_internal::_streamName.substr(0,flvplayback_internal::_streamName.length - 4);
  487.             }
  488.             flvplayback_internal::_streamLength = flvplayback_internal::_streams[0].dur;
  489.          }
  490.          if(flvplayback_internal::_isRTMP)
  491.          {
  492.             flvplayback_internal::connectRTMP();
  493.          }
  494.          else if(flvplayback_internal::_streamName != null && flvplayback_internal::_streamName.indexOf("/fms/fpad") >= 0)
  495.          {
  496.             flvplayback_internal::connectFPAD(flvplayback_internal::_streamName);
  497.          }
  498.          else
  499.          {
  500.             if(flvplayback_internal::_autoSenseBW)
  501.             {
  502.                flvplayback_internal::bitrateMatch();
  503.             }
  504.             flvplayback_internal::connectHTTP();
  505.             flvplayback_internal::_owner.ncConnected();
  506.          }
  507.       }
  508.       
  509.       public function get netConnection() : NetConnection
  510.       {
  511.          return flvplayback_internal::_nc;
  512.       }
  513.       
  514.       public function get bitrate() : Number
  515.       {
  516.          return flvplayback_internal::_bitrate;
  517.       }
  518.       
  519.       public function setProperty(param1:String, param2:*) : void
  520.       {
  521.          switch(param1)
  522.          {
  523.             case "fallbackServerName":
  524.                fallbackServerName = String(param2);
  525.                break;
  526.             case "fpadZone":
  527.                flvplayback_internal::_fpadZone = Number(param2);
  528.                break;
  529.             case "objectEncoding":
  530.                flvplayback_internal::_objectEncoding = uint(param2);
  531.                break;
  532.             case "proxyType":
  533.                flvplayback_internal::_proxyType = String(param2);
  534.                break;
  535.             default:
  536.                throw new VideoError(VideoError.UNSUPPORTED_PROPERTY,param1);
  537.          }
  538.       }
  539.       
  540.       public function get timeout() : uint
  541.       {
  542.          return flvplayback_internal::_timeoutTimer.delay;
  543.       }
  544.       
  545.       public function set videoPlayer(param1:VideoPlayer) : void
  546.       {
  547.          flvplayback_internal::_owner = param1;
  548.       }
  549.       
  550.       flvplayback_internal function bitrateMatch() : void
  551.       {
  552.          var _loc1_:Number = NaN;
  553.          var _loc2_:uint = 0;
  554.          var _loc3_:uint = 0;
  555.          _loc1_ = flvplayback_internal::_bitrate;
  556.          if(isNaN(_loc1_))
  557.          {
  558.             _loc1_ = 0;
  559.          }
  560.          _loc2_ = flvplayback_internal::_streams.length;
  561.          _loc3_ = 0;
  562.          while(_loc3_ < flvplayback_internal::_streams.length)
  563.          {
  564.             if(isNaN(flvplayback_internal::_streams[_loc3_].bitrate) || _loc1_ >= flvplayback_internal::_streams[_loc3_].bitrate)
  565.             {
  566.                _loc2_ = _loc3_;
  567.                break;
  568.             }
  569.             _loc3_++;
  570.          }
  571.          if(_loc2_ == flvplayback_internal::_streams.length)
  572.          {
  573.             throw new VideoError(VideoError.NO_BITRATE_MATCH);
  574.          }
  575.          if(flvplayback_internal::_streamName != null)
  576.          {
  577.             flvplayback_internal::_streamName += flvplayback_internal::_streams[_loc2_].src;
  578.          }
  579.          else
  580.          {
  581.             flvplayback_internal::_streamName = flvplayback_internal::_streams[_loc2_].src;
  582.          }
  583.          if(flvplayback_internal::_isRTMP && flvplayback_internal::_streamName.substr(-4).toLowerCase() == ".flv")
  584.          {
  585.             flvplayback_internal::_streamName = flvplayback_internal::_streamName.substr(0,flvplayback_internal::_streamName.length - 4);
  586.          }
  587.          flvplayback_internal::_streamLength = flvplayback_internal::_streams[_loc2_].dur;
  588.       }
  589.       
  590.       flvplayback_internal function disconnectOnStatus(param1:NetStatusEvent) : void
  591.       {
  592.          if(param1.info.code == "NetConnection.Connect.Success")
  593.          {
  594.             param1.target.removeEventListener(NetStatusEvent.NET_STATUS,flvplayback_internal::disconnectOnStatus);
  595.             param1.target.close();
  596.          }
  597.       }
  598.       
  599.       flvplayback_internal function nextConnect(param1:TimerEvent = null) : void
  600.       {
  601.          var _loc2_:String = null;
  602.          var _loc3_:String = null;
  603.          var _loc4_:String = null;
  604.          if(flvplayback_internal::_connTypeCounter == 0)
  605.          {
  606.             _loc2_ = flvplayback_internal::_protocol;
  607.             _loc3_ = flvplayback_internal::_portNumber;
  608.          }
  609.          else
  610.          {
  611.             _loc3_ = null;
  612.             if(flvplayback_internal::_protocol == "rtmp:/")
  613.             {
  614.                _loc2_ = "rtmpt:/";
  615.             }
  616.             else
  617.             {
  618.                if(flvplayback_internal::_protocol != "rtmpe:/")
  619.                {
  620.                   flvplayback_internal::_tryNC.pop();
  621.                   return;
  622.                }
  623.                _loc2_ = "rtmpte:/";
  624.             }
  625.          }
  626.          _loc4_ = _loc2_ + (flvplayback_internal::_serverName == null ? "" : "/" + flvplayback_internal::_serverName + (_loc3_ == null ? "" : ":" + _loc3_) + "/") + (flvplayback_internal::_wrappedURL == null ? "" : flvplayback_internal::_wrappedURL + "/") + flvplayback_internal::_appName;
  627.          flvplayback_internal::_tryNC[flvplayback_internal::_connTypeCounter].client.pending = true;
  628.          flvplayback_internal::_tryNC[flvplayback_internal::_connTypeCounter].connect(_loc4_,flvplayback_internal::_autoSenseBW);
  629.          if(flvplayback_internal::_connTypeCounter < flvplayback_internal::_tryNC.length - 1)
  630.          {
  631.             ++flvplayback_internal::_connTypeCounter;
  632.             flvplayback_internal::_tryNCTimer.reset();
  633.             flvplayback_internal::_tryNCTimer.start();
  634.          }
  635.       }
  636.       
  637.       flvplayback_internal function connectFPAD(param1:String) : Boolean
  638.       {
  639.          var _loc2_:Object = null;
  640.          var _loc3_:String = null;
  641.          var _loc4_:String = null;
  642.          var _loc5_:String = null;
  643.          var _loc6_:ParseResults = null;
  644.          _loc2_ = /^(.+)(\?|\&)(uri=)([^&]+)(\&.*)?$/.exec(param1);
  645.          if(_loc2_ == null)
  646.          {
  647.             throw new VideoError(VideoError.INVALID_SOURCE,"fpad url must include uri parameter: " + param1);
  648.          }
  649.          _loc3_ = String(_loc2_[1] + _loc2_[2]);
  650.          _loc4_ = String(_loc2_[4]);
  651.          _loc5_ = _loc2_[5] == undefined ? "" : String(_loc2_[5]);
  652.          if(!(_loc6_ = flvplayback_internal::parseURL(_loc4_)).isRTMP)
  653.          {
  654.             throw new VideoError(VideoError.INVALID_SOURCE,"fpad url uri parameter must be rtmp url: " + param1);
  655.          }
  656.          flvplayback_internal::_fpadMgr = new FPADManager(this);
  657.          return flvplayback_internal::_fpadMgr.flvplayback_internal::connectXML(_loc3_,_loc4_,_loc5_,_loc6_);
  658.       }
  659.       
  660.       flvplayback_internal function connectHTTP() : Boolean
  661.       {
  662.          flvplayback_internal::_nc = new NetConnection();
  663.          flvplayback_internal::_nc.connect(null);
  664.          flvplayback_internal::_ncConnected = true;
  665.          return true;
  666.       }
  667.       
  668.       public function get isRTMP() : Boolean
  669.       {
  670.          return flvplayback_internal::_isRTMP;
  671.       }
  672.       
  673.       public function get streamLength() : Number
  674.       {
  675.          return flvplayback_internal::_streamLength;
  676.       }
  677.       
  678.       public function connectAgain() : Boolean
  679.       {
  680.          var _loc1_:int = 0;
  681.          var _loc2_:* = null;
  682.          _loc1_ = flvplayback_internal::_appName.indexOf("/");
  683.          if(_loc1_ < 0)
  684.          {
  685.             _loc1_ = flvplayback_internal::_streamName.indexOf("/");
  686.             if(_loc1_ >= 0)
  687.             {
  688.                flvplayback_internal::_appName += "/";
  689.                flvplayback_internal::_appName += flvplayback_internal::_streamName.slice(0,_loc1_);
  690.                flvplayback_internal::_streamName = flvplayback_internal::_streamName.slice(_loc1_ + 1);
  691.             }
  692.             return false;
  693.          }
  694.          _loc2_ = flvplayback_internal::_appName.slice(_loc1_ + 1);
  695.          _loc2_ += "/";
  696.          _loc2_ += flvplayback_internal::_streamName;
  697.          flvplayback_internal::_streamName = _loc2_;
  698.          flvplayback_internal::_appName = flvplayback_internal::_appName.slice(0,_loc1_);
  699.          close();
  700.          flvplayback_internal::_payload = 0;
  701.          flvplayback_internal::_connTypeCounter = 0;
  702.          flvplayback_internal::cleanConns();
  703.          flvplayback_internal::connectRTMP();
  704.          return true;
  705.       }
  706.       
  707.       flvplayback_internal function parseURL(param1:String) : ParseResults
  708.       {
  709.          var _loc2_:ParseResults = null;
  710.          var _loc3_:int = 0;
  711.          var _loc4_:int = 0;
  712.          var _loc5_:int = 0;
  713.          var _loc6_:int = 0;
  714.          var _loc7_:String = null;
  715.          var _loc8_:ParseResults = null;
  716.          _loc2_ = new ParseResults();
  717.          _loc3_ = 0;
  718.          if((_loc4_ = param1.indexOf(":/",_loc3_)) >= 0)
  719.          {
  720.             _loc4_ += 2;
  721.             _loc2_.protocol = param1.slice(_loc3_,_loc4_).toLowerCase();
  722.             _loc2_.isRelative = false;
  723.          }
  724.          else
  725.          {
  726.             _loc2_.isRelative = true;
  727.          }
  728.          if(_loc2_.protocol != null && (_loc2_.protocol == "rtmp:/" || _loc2_.protocol == "rtmpt:/" || _loc2_.protocol == "rtmps:/" || _loc2_.protocol == "rtmpe:/" || _loc2_.protocol == "rtmpte:/"))
  729.          {
  730.             _loc2_.isRTMP = true;
  731.             _loc3_ = _loc4_;
  732.             if(param1.charAt(_loc3_) == "/")
  733.             {
  734.                _loc3_++;
  735.                _loc5_ = param1.indexOf(":",_loc3_);
  736.                if((_loc6_ = param1.indexOf("/",_loc3_)) < 0)
  737.                {
  738.                   if(_loc5_ < 0)
  739.                   {
  740.                      _loc2_.serverName = param1.slice(_loc3_);
  741.                   }
  742.                   else
  743.                   {
  744.                      _loc4_ = _loc5_;
  745.                      _loc2_.portNumber = param1.slice(_loc3_,_loc4_);
  746.                      _loc3_ = _loc4_ + 1;
  747.                      _loc2_.serverName = param1.slice(_loc3_);
  748.                   }
  749.                   return _loc2_;
  750.                }
  751.                if(_loc5_ >= 0 && _loc5_ < _loc6_)
  752.                {
  753.                   _loc4_ = _loc5_;
  754.                   _loc2_.serverName = param1.slice(_loc3_,_loc4_);
  755.                   _loc3_ = _loc4_ + 1;
  756.                   _loc4_ = _loc6_;
  757.                   _loc2_.portNumber = param1.slice(_loc3_,_loc4_);
  758.                }
  759.                else
  760.                {
  761.                   _loc4_ = _loc6_;
  762.                   _loc2_.serverName = param1.slice(_loc3_,_loc4_);
  763.                }
  764.                _loc3_ = _loc4_ + 1;
  765.             }
  766.             if(param1.charAt(_loc3_) == "?")
  767.             {
  768.                _loc7_ = param1.slice(_loc3_ + 1);
  769.                if((_loc8_ = flvplayback_internal::parseURL(_loc7_)).protocol == null || !_loc8_.isRTMP)
  770.                {
  771.                   throw new VideoError(VideoError.INVALID_SOURCE,param1);
  772.                }
  773.                _loc2_.wrappedURL = "?";
  774.                _loc2_.wrappedURL += _loc8_.protocol;
  775.                if(_loc8_.serverName != null)
  776.                {
  777.                   _loc2_.wrappedURL += "/";
  778.                   _loc2_.wrappedURL += _loc8_.serverName;
  779.                }
  780.                if(_loc8_.portNumber != null)
  781.                {
  782.                   _loc2_.wrappedURL += ":" + _loc8_.portNumber;
  783.                }
  784.                if(_loc8_.wrappedURL != null)
  785.                {
  786.                   _loc2_.wrappedURL += "/";
  787.                   _loc2_.wrappedURL += _loc8_.wrappedURL;
  788.                }
  789.                _loc2_.appName = _loc8_.appName;
  790.                _loc2_.streamName = _loc8_.streamName;
  791.                return _loc2_;
  792.             }
  793.             if((_loc4_ = param1.indexOf("/",_loc3_)) < 0)
  794.             {
  795.                _loc2_.appName = param1.slice(_loc3_);
  796.                return _loc2_;
  797.             }
  798.             _loc2_.appName = param1.slice(_loc3_,_loc4_);
  799.             _loc3_ = _loc4_ + 1;
  800.             if((_loc4_ = param1.indexOf("/",_loc3_)) < 0)
  801.             {
  802.                _loc2_.streamName = param1.slice(_loc3_);
  803.                if(_loc2_.streamName.slice(-4).toLowerCase() == ".flv")
  804.                {
  805.                   _loc2_.streamName = _loc2_.streamName.slice(0,-4);
  806.                }
  807.                return _loc2_;
  808.             }
  809.             _loc2_.appName += "/";
  810.             _loc2_.appName += param1.slice(_loc3_,_loc4_);
  811.             _loc3_ = _loc4_ + 1;
  812.             _loc2_.streamName = param1.slice(_loc3_);
  813.             if(_loc2_.streamName.slice(-4).toLowerCase() == ".flv")
  814.             {
  815.                _loc2_.streamName = _loc2_.streamName.slice(0,-4);
  816.             }
  817.          }
  818.          else
  819.          {
  820.             _loc2_.isRTMP = false;
  821.             _loc2_.streamName = param1;
  822.          }
  823.          return _loc2_;
  824.       }
  825.       
  826.       flvplayback_internal function initOtherInfo() : void
  827.       {
  828.          flvplayback_internal::_contentPath = null;
  829.          flvplayback_internal::_streamName = null;
  830.          flvplayback_internal::_streamWidth = -1;
  831.          flvplayback_internal::_streamHeight = -1;
  832.          flvplayback_internal::_streamLength = NaN;
  833.          flvplayback_internal::_streams = null;
  834.          flvplayback_internal::_autoSenseBW = false;
  835.          flvplayback_internal::_payload = 0;
  836.          flvplayback_internal::_connTypeCounter = 0;
  837.          flvplayback_internal::cleanConns();
  838.       }
  839.       
  840.       public function set timeout(param1:uint) : void
  841.       {
  842.          flvplayback_internal::_timeoutTimer.delay = param1;
  843.       }
  844.       
  845.       flvplayback_internal function _onFMSConnectTimeOut(param1:TimerEvent = null) : void
  846.       {
  847.          flvplayback_internal::cleanConns();
  848.          flvplayback_internal::_nc = null;
  849.          flvplayback_internal::_ncConnected = false;
  850.          if(!connectAgain())
  851.          {
  852.             flvplayback_internal::_owner.ncConnected();
  853.          }
  854.       }
  855.       
  856.       public function get streamHeight() : int
  857.       {
  858.          return flvplayback_internal::_streamHeight;
  859.       }
  860.       
  861.       flvplayback_internal function connectOnStatus(param1:NetStatusEvent) : void
  862.       {
  863.          var _loc2_:ParseResults = null;
  864.          param1.target.client.pending = false;
  865.          if(param1.info.code == "NetConnection.Connect.Success")
  866.          {
  867.             flvplayback_internal::_nc = flvplayback_internal::_tryNC[param1.target.client.connIndex];
  868.             flvplayback_internal::cleanConns();
  869.          }
  870.          else if(param1.info.code == "NetConnection.Connect.Rejected" && param1.info.ex != null && param1.info.ex.code == 302)
  871.          {
  872.             flvplayback_internal::_connTypeCounter = 0;
  873.             flvplayback_internal::cleanConns();
  874.             _loc2_ = flvplayback_internal::parseURL(param1.info.ex.redirect);
  875.             if(_loc2_.isRTMP)
  876.             {
  877.                flvplayback_internal::_protocol = _loc2_.protocol;
  878.                flvplayback_internal::_serverName = _loc2_.serverName;
  879.                flvplayback_internal::_wrappedURL = _loc2_.wrappedURL;
  880.                flvplayback_internal::_portNumber = _loc2_.portNumber;
  881.                flvplayback_internal::_appName = _loc2_.appName;
  882.                if(_loc2_.streamName != null)
  883.                {
  884.                   flvplayback_internal::_appName += "/" + _loc2_.streamName;
  885.                }
  886.                flvplayback_internal::connectRTMP();
  887.             }
  888.             else
  889.             {
  890.                flvplayback_internal::tryFallBack();
  891.             }
  892.          }
  893.          else if((param1.info.code == "NetConnection.Connect.Failed" || param1.info.code == "NetConnection.Connect.Rejected") && param1.target.client.connIndex == flvplayback_internal::_tryNC.length - 1)
  894.          {
  895.             if(!connectAgain())
  896.             {
  897.                flvplayback_internal::tryFallBack();
  898.             }
  899.          }
  900.       }
  901.       
  902.       flvplayback_internal function onReconnected() : void
  903.       {
  904.          flvplayback_internal::_ncConnected = true;
  905.          flvplayback_internal::_owner.ncReconnected();
  906.       }
  907.       
  908.       flvplayback_internal function tryFallBack() : void
  909.       {
  910.          if(flvplayback_internal::_serverName == fallbackServerName || fallbackServerName == null)
  911.          {
  912.             flvplayback_internal::_nc = null;
  913.             flvplayback_internal::_ncConnected = false;
  914.             flvplayback_internal::_owner.ncConnected();
  915.          }
  916.          else
  917.          {
  918.             flvplayback_internal::_connTypeCounter = 0;
  919.             flvplayback_internal::cleanConns();
  920.             flvplayback_internal::_serverName = fallbackServerName;
  921.             flvplayback_internal::connectRTMP();
  922.          }
  923.       }
  924.       
  925.       public function set bitrate(param1:Number) : void
  926.       {
  927.          if(!flvplayback_internal::_isRTMP)
  928.          {
  929.             flvplayback_internal::_bitrate = param1;
  930.          }
  931.       }
  932.       
  933.       flvplayback_internal function onConnected(param1:NetConnection, param2:Number) : void
  934.       {
  935.          var _loc3_:Array = null;
  936.          var _loc4_:uint = 0;
  937.          var _loc5_:String = null;
  938.          flvplayback_internal::_timeoutTimer.stop();
  939.          param1.removeEventListener(NetStatusEvent.NET_STATUS,flvplayback_internal::connectOnStatus);
  940.          flvplayback_internal::_nc = param1;
  941.          flvplayback_internal::_ncUri = flvplayback_internal::_nc.uri;
  942.          flvplayback_internal::_ncConnected = true;
  943.          if(flvplayback_internal::_autoSenseBW)
  944.          {
  945.             flvplayback_internal::_bitrate = param2 * 1024;
  946.             if(flvplayback_internal::_streams != null)
  947.             {
  948.                flvplayback_internal::bitrateMatch();
  949.             }
  950.             else
  951.             {
  952.                _loc3_ = flvplayback_internal::_streamName.split(",");
  953.                _loc4_ = 0;
  954.                while(_loc4_ < _loc3_.length)
  955.                {
  956.                   _loc5_ = flvplayback_internal::stripFrontAndBackWhiteSpace(_loc3_[_loc4_]);
  957.                   if(_loc4_ + 1 >= _loc3_.length)
  958.                   {
  959.                      flvplayback_internal::_streamName = _loc5_;
  960.                      break;
  961.                   }
  962.                   if(param2 <= Number(_loc3_[_loc4_ + 1]))
  963.                   {
  964.                      flvplayback_internal::_streamName = _loc5_;
  965.                      break;
  966.                   }
  967.                   _loc4_ += 2;
  968.                }
  969.                if(flvplayback_internal::_streamName.slice(-4).toLowerCase() == ".flv")
  970.                {
  971.                   flvplayback_internal::_streamName = flvplayback_internal::_streamName.slice(0,-4);
  972.                }
  973.             }
  974.          }
  975.          if(!flvplayback_internal::_owner.isLive && isNaN(flvplayback_internal::_streamLength))
  976.          {
  977.             flvplayback_internal::_nc.call("getStreamLength",new Responder(flvplayback_internal::getStreamLengthResult),flvplayback_internal::_streamName);
  978.          }
  979.          else
  980.          {
  981.             flvplayback_internal::_owner.ncConnected();
  982.          }
  983.       }
  984.       
  985.       public function close() : void
  986.       {
  987.          if(flvplayback_internal::_nc)
  988.          {
  989.             flvplayback_internal::_nc.close();
  990.             flvplayback_internal::_ncConnected = false;
  991.          }
  992.       }
  993.    }
  994. }
  995.